package com.jt.service;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.anno.CacheFind;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

@Service
public class ItemCatServiceImpl implements ItemCatService{

	@Autowired
	private ItemCatMapper itemCatMapper;

	@Autowired(required = false)	//告诉Spring容器，当被调用的时候再注入，没有被调用不用管它
	private Jedis jedis;

	//商品分类名称回显
	@Override
	public ItemCat findItemCatById(Long itemCatId) {
		
		return itemCatMapper.selectById(itemCatId);
	}

	/**
	 * 据接口添加实现类的方法
	 * 业务思路:
	 * 	1.用户传递的数据parentId
	 * 	2.可以查询List<ItemCat>数据库对象信息.
	 * 	3.动态的将ItemCat对象转化为EasyUITree对象
	 * 	3.但是返回值要求 返回List<EasyUITree>
	 */
	//直查数据库获取商品分类名称
	@Override
	@CacheFind(key = "ITEM_CAT_LIST")	//使用注解自定义前缀
	public List<EasyUITree> findItemCatByParentId(Long parentId) {
		QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("parent_id",parentId);
		List<ItemCat> itemCatList = itemCatMapper.selectList(queryWrapper);
		List<EasyUITree> treeList = new ArrayList<>();	//先准备一个空集合
		//需要把数据格式转换
		for (ItemCat itemCat : itemCatList) {
			Long id = itemCat.getId();	//获取ID
			String name = itemCat.getName();	//获取文本
			//如果是父级,则默认应该处于关闭状态 closed, 如果不是父级 则应该处于打开状态. open
			String state = itemCat.getIsParent()?"closed":"open";	//三目运算
			//构造方法赋值
			EasyUITree tree = new EasyUITree(id,name,state);
			treeList.add(tree);
		}
		return treeList;
	}

	//通过redis缓存获取数据
	@SuppressWarnings("unchecked")		//告诉编译器忽略 unchecked 警告信息，如使用List，ArrayList等未进行参数化产生的警告信息。
	@Override
	public List<EasyUITree> findItemCatByRedis(Long parentId) {
		//1.定义redis的Key
		String key = "ITEM_CAT_LIST::" + parentId;
		//2.构建所需集合
		List<EasyUITree> treeList = new ArrayList<>();
		long startTime = System.currentTimeMillis();
		//3.判断redis中是否有这个值
		if (jedis.exists(key)){
			//3.1如果有则取到它的值
			String json = jedis.get(key);
			Long endTime = System.currentTimeMillis();
			//3.2将JSON串转换成对象封装到集合中并返回
			treeList = ObjectMapperUtil.toObject(json, treeList.getClass());
			System.out.println("redis从缓存中查询的时间为："+(endTime-startTime)+"毫秒");
		}else {
			//4.如果redis中没有这个值则调用从数据库查询的方法去查询
			treeList = findItemCatByParentId(parentId);
			Long endTime = System.currentTimeMillis();
			//5.查询出来后使用工具API封装为字符串
			String json = ObjectMapperUtil.toJson(treeList);
			//6.保存到redis中下次再使用
			jedis.set(key,json);
			System.out.println("从数据库查询的时间为："+(endTime-startTime)+"毫秒");
		}
		return treeList;
	}


}
